# views 路由 + 视图函数
from itertools import count

from flask import Blueprint, request, render_template
from .models import *
from sqlalchemy import desc, and_, or_, not_, asc


# 蓝图 需要到__init__.py当中绑定blue
blue = Blueprint('user', __name__)


@blue.route('/')
def index():
    return 'index'


# 单表操作: 增删改查
# 增
@blue.route('/add_user/')
def add_user():
    # 添加一条数据
    # u = User()
    # u.name = 'tom'
    # u.age = 18
    # # 同步数据库
    # db.session.add(u)  # 把对象添加到session当中
    # db.session.commit()  # 同步到数据库中，提交

    # 同时添加多条数据
    users = []
    for i in range(10, 30):
        u = User()
        u.name = 'jack' + str(i)
        u.age = i
        users.append(u)

    # 异常处理
    try:
        db.session.add_all(users)  # 把对象添加到session当中
        db.session.commit()  # 同步到数据库中，事务提交
    except Exception as e:
        db.session.rollback()  # 事务回滚
        db.session.flush()  # 清空缓存
        return 'fail' + str(e)  # 异常信息

    return 'success'


# 删除数据
# 找到要删除的数据，然后删除
@blue.route('/del_user/')
def del_user():
    # 删除一条数据
    u = User.query.first()
    db.session.delete(u)
    db.session.commit()

    return 'success'

# 修改数据
# 找到要修改的数据，然后修改
@blue.route('/update_user/')
def update_user():
    u = User.query.first()
    u.age = 200             # 修改数据
    db.session.commit()

    return 'success'

# 查询数据
# 条件
@blue.route('/get_user/')
def get_user():
    # users = User.query.all()   # 查询所有数据
    # print(users)
    # SELECT user.id AS user_id, user.name AS user_name, user.age AS user_age
    # print(User.query, type(User.query))   # 返回时list
    # print(users, type(users))

    # filter() 过滤数据
    # users = User.query.filter().filter(User.age > 18)
    # print(users, type(users))   # 查询集
    # print(list(users))

    # get()：查询到对应主键的数据对象
    # user = User.query.get(8)
    # print(user, type(user)) # <class 'App.models.User'>
    # print(user.name, user.age)  # 获取数据的属性

    # filter()：类似SQL中的where
    # filter_by()：用于等值操作的过滤
    # users = User.query.filter(User.age==20)
    # print(list(users))  # [jack20]
    # users = User.query.filter_by(age>20)    # 非等值操作是报错的
    # users = User.query.filter_by(age=20)    # 只能适用于等值操作

    # users = User.query.filter(User.age > 30)  # 适用于非等值操作
    # print(list(users))


    # first()：获取第一个数据对象
    # first_or_404(): 第一条数据，如果不存在则抛出404错误
    # user = User.query.first()
    # print(user)
    # user = User.query.first_or_404()
    # 不存在的数据会抛出404错误
    # user = User.query.filter_by(age=400).first_or_404()
    # print(user)

    # count()：统计数据的数量
    # users = User.query.filter()
    # print(users.count())

    # limit()  前几条
    # offset() 跳过前几条
    # users = User.query.offset(3).limit(4)  # 跳过前3条，取后面4条
    # print(list(users))

    # order_by() 排序
    # users = User.query.order_by('age')  # 升序，从小到大
    # 降序, 先进行导入包
    # from sqlalchemy import desc
    # users = User.query.order_by(desc('age'))  # 降序，从大到小
    # print(list(users))

    # and or not 逻辑运算
    # users = User.query.filter(User.age > 20, User.age < 25)  # 年龄大于20并且小于25
    # users = User.query.filter(and_(User.age > 20, User.age < 25))  # 年龄大于20 and 小于25
    # users = User.query.filter(or_(User.age > 25, User.age < 20))  # 年龄大于25 or 小于20
    # users = User.query.filter(not_(User.age > 200))  # 年龄大于10
    # print(list(users))

    # 查询属性
    # contains() 包含模糊查询
    # users = User.query.filter(User.name.contains('3'))  # 模糊查询
    # in 其中之一
    # users = User.query.filter(User.age.in_([10, 20, 30, 40, 50]))  # 年龄在其中之一
    # startswith() 以什么开头
    # endswith() 以什么结尾
    # like() 模糊查询
    # users = User.query.filter(User.name.startswith('jack')) # 以jack开头
    # users = User.query.filter(User.name.endswith('2')) # 以2结尾

    # __gt__() 大于
    # __lt__() 小于
    # __ge__() 大于等于
    # __le__() 小于等于
    # __eq__() 等于

    users = User.query.filter(User.age.__gt__(25)) # 大于25
    print(list(users))


    # 分页, 翻页
    # 1. 手工分页
    #     offset
    # 数据： 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
    # 页码：page
    # 每页显示数量: per_page = 5
    # page=1: 1 2 3 4 5                  ==> offset(0).limit(5)
    # page=2: 6 7 8 9 10                 ==> offset(5).limit(5)
    # page=3: 11 12 13 14 15             ==> offset(10).limit(5)
    # page=4: 16 17 18 19 20             ==> offset(15).limit(5)
    # ...
    # page=n                    ==> offset((page-1)*per_page).limit(per_page)
   # return 'success'
# 2.pageinate 对象
@blue.route('/pageinate/')
def get_pageinate():
    # 页码，默认显示第一页
    page = int(request.args.get('page', 1))
    # per_page: 每一页现实的数量
    per_page = int(request.args.get('per_page', 5))
    # print(page, type(page))
    # print(per_page, type(per_page))

    # paginate 分页
    p = User.query.paginate(page=page, per_page=per_page, error_out=False)
    # paginate对象属性
    # items: 返回当前页的内容列表
    # print(p.items)
    # has_next: 是否有下一页
    # print(p.has_next)
    # has_prev: 是否有上一页
    # print(p.has_prev)
    # next(error_out=False): 返回下一页的paginate对象
    # print(p.next(error_out=False))
    # prev(error_out=False): 返回上一页的paginate对象
    # print(p.prev(error_out=False))
    # page: 当前页
    # print(p.page)
    # pages: 总页数
    # print(p.pages)
    # per_page: 每页显示的数量
    # print(p.per_page)
    # total: 总记录数
    # print(p.total)
    # prev_num: 上一页的页码
    # print(p.prev_num)
    # next_num: 下一页的页码
    # print(p.next_num)
    return render_template('pageinate.html', p=p)
